home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 34.zip / BS1 part 34 / GFA basic training.adf / Erweiterung / DISK_MONITOR.LST < prev    next >
File List  |  1989-06-01  |  4KB  |  159 lines

  1. ' Diskzugriff mit trackdisk.device auf einzelne Sektoren
  2. ' Minidiskmonitor für GFA-Basic Programmierung
  3. ' Thomas Knab am 4.3.1989
  4. '
  5. INPUT "Mit welchem Laufwerk arbeiten ? DF",lw%
  6. '
  7. @init
  8. DO
  9.   @menu
  10.   EXIT IF sektornummer&=-1
  11.   @sector_lesen
  12.   @ausgeben
  13. LOOP
  14. @zumachen
  15. EDIT
  16. '
  17. '
  18. PROCEDURE init
  19.   ' In das Array fehler$() werden die Klartexte der Fehlermeldungen
  20.   ' eingelesen
  21.   DIM fehler$(15)
  22.   FOR i|=0 TO 15
  23.     READ fehler$(i|)
  24.   NEXT i|
  25.   ' Hier beginnen wir die Strukturen einzurichten
  26.   ' Erst den Speicher für IO_Request Struktur reservieren :
  27.   ioadr%=MALLOC(80,&H10002)
  28.   IF ioadr%=0
  29.     PRINT "Kein Speicher für DISKIO!!"
  30.     END
  31.   ENDIF
  32.   ' Der Speicher für die Informationsübergabe:
  33.   readreply%=MALLOC(32,&H10002)
  34.   IF readreply%=0
  35.     PRINT "Kein Speicher für Reply Struktur !!!"
  36.     ~MFREE(ioadr%,80)
  37.     END
  38.   ENDIF
  39.   ' Nun noch den Speicher für unseren eigenen Diskbuffer
  40.   ' für einen Sektor (512 Bytes)
  41.   sektorbuffer%=MALLOC(512,&H10002)
  42.   IF sektorbuffer%=0
  43.     PRINT "Kein Speicher für Buffer !!!"
  44.     ~MFREE(ioadr%,80)
  45.     ~MFREE(readreply%,32)
  46.     END
  47.   ENDIF
  48.   ' Struktur Initialisieren
  49.   SUB task%,task%
  50.   taskadr%=FindTask(task%)
  51.   LONG{readreply%+&H10}=taskadr%
  52.   ~AddPort(readreply%)
  53.   '
  54.   ' Disk Device öffnen
  55.   devname$="trackdisk.device"+CHR$(0)
  56.   devname%=VARPTR(devname$)
  57.   ' Laufwerk lw%, keine Flags
  58.   ok%=OpenDevice(devname%,lw%,ioadr%,0)
  59.   ' Nur ein Fehlertest, ob alles gelungen ist.
  60.   IF ok%<>0
  61.     PRINT "Trackdisk Device konnte nicht geöffnet werden !!"
  62.     PRINT "   LAUFWERK EXISTIERT NICHT"
  63.     ~RemPort(readreply%)        ! Port wieder freigeben
  64.     ~MFREE(ioadr%,80)           ! Den Speicher wieder freigeben
  65.     ~MFREE(readreply%,32)
  66.     ~MFREE(sektorbuffer%,512)
  67.     END
  68.   ENDIF
  69. RETURN
  70. PROCEDURE menu
  71.   CLS
  72.   PRINT "   Erlaubte Disksektornummern sind: 0 bis 1759"
  73.   PRINT "   Direktory ist auf Sektor 880"
  74.   PRINT "   Bootblock (Virus?) ist Sektor 0 und 1"
  75.   PRINT
  76.   PRINT "   Fortsetzung und Ende der Ausgabe durch Maustaste"
  77.   PRINT
  78.   PRINT "   Programmende NUR durch '-1' !! um Strukturen zu schließen"
  79.   PRINT
  80.   INPUT "   Welchen Sektor lesen";sektornummer&
  81. RETURN
  82. PROCEDURE sector_lesen
  83.   ' IO-Struktur mit Werten versorgen
  84.   ' Die Adresse der ReadReply-Routine übergeben
  85.   LONG{ioadr%+14}=readreply%
  86.   ' Commando: lesen (=2) übergeben
  87.   DPOKE ioadr%+28,2
  88.   ' Die Adresse des Floppybuffers für die Daten:
  89.   LONG{ioadr%+40}=sektorbuffer%
  90.   ' Wieviel Bytes sollen gelsen werden  (ein Sektor) ?:
  91.   LONG{ioadr%+36}=512
  92.   ' Welchen Sektor der Disk lesen (in Bytes):
  93.   sektorposition%=512*sektornummer&
  94.   LONG{ioadr%+44}=sektorposition%
  95.   ' ... und das Lesen beginnen
  96.   ok2%=DoIO(ioadr%)
  97.   ' Trackdiskfehler aufgetreten ?
  98.   IF ok2%<>0
  99.     fehler&=PEEK(ioadr%+31)
  100.     PRINT " DISK-Error : #";fehler&-220;" aufgetreten !!"
  101.     PRINT " Typ        :";fehler$(fehler&-240)
  102.     @zumachen
  103.     END
  104.   ENDIF
  105.   '
  106.   ' Motor aus (9 = TD_MOTOR)
  107.   DPOKE (ioadr%+28),9
  108.   ' Bytelänge 0
  109.   LONG{ioadr%+36}=0
  110.   ~DoIO(ioadr%)
  111. RETURN
  112. PROCEDURE ausgeben
  113.   CLS
  114.   FOR j|=0 TO 31
  115.     FOR i|=0 TO 15
  116.       aus%=PEEK(sektorbuffer%+i|+j|*16)
  117.       PRINT AT(i|*3+5,j|+2);"00";
  118.       PRINT AT(i|*3+5,j|+2);HEX$(aus%);
  119.       IF aus%<20
  120.         PRINT AT(i|+60,j|+2);".";       ! Keine Darstellungsmöglichkeit für ASCII-Zeichen kleiner 20
  121.       ELSE
  122.         PRINT AT(i|+60,j|+2);CHR$(aus%);
  123.       ENDIF
  124.     NEXT i|
  125.     PRINT
  126.     IF j|=15
  127.       REPEAT
  128.       UNTIL MOUSEK
  129.     ENDIF
  130.   NEXT j|
  131.   REPEAT
  132.   UNTIL MOUSEK
  133. RETURN
  134. PROCEDURE zumachen
  135.   ~RemPort(readreply%)
  136.   ~CloseDevice(ioadr%)
  137.   ~MFREE(ioadr%,80)
  138.   ~MFREE(readreply%,32)
  139.   ~MFREE(sektorbuffer%,512)
  140. RETURN
  141. PROCEDURE fehlermeldungen
  142.   DATA "Unbekannter Fehler"
  143.   DATA "Sektor Header fehlt"
  144.   DATA "Ungültige Sektor Preamble"
  145.   DATA "Ungültige Sektor-ID"
  146.   DATA "Falsche Header Checksum"
  147.   DATA "Falsche Sektor Checksum"
  148.   DATA "Zuwenig Sektoren"
  149.   DATA "Ungültiger Sektor Header"
  150.   DATA "Disk Schreibeschützt"
  151.   DATA "Disk ist gewechselt worden"
  152.   DATA "Track nicht gefunden"
  153.   DATA "nicht genug Speicher"
  154.   DATA "ungültige Sektornummer"
  155.   DATA "ungültiges Laufwerk"
  156.   DATA "Laufwerk schon aktiv"
  157.   DATA "Reset-Phase"
  158. RETURN
  159.